﻿2026-05-10T11:48:02.3830709Z ##[group]Run pnpm verify:phase-5
2026-05-10T11:48:02.3831029Z [36;1mpnpm verify:phase-5[0m
2026-05-10T11:48:02.3852462Z shell: /usr/bin/bash -e {0}
2026-05-10T11:48:02.3852718Z env:
2026-05-10T11:48:02.3852968Z   PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
2026-05-10T11:48:02.3853306Z   SKIP_PHASE_3_CARRYOVER: 1
2026-05-10T11:48:02.3853542Z   SKIP_TRACE_CHECK: 1
2026-05-10T11:48:02.3853754Z ##[endgroup]
2026-05-10T11:48:02.6953105Z 
2026-05-10T11:48:02.6954238Z > rebno@0.0.0 verify:phase-5 /home/runner/work/rebno/rebno
2026-05-10T11:48:02.6957165Z > node scripts/verify-phase-5.mjs
2026-05-10T11:48:02.6957542Z 
2026-05-10T11:48:02.7275863Z 
2026-05-10T11:48:02.7276623Z === Phase 4 carry-over: verify-phase-4 ===
2026-05-10T11:48:02.7279530Z >>> pnpm verify:phase-4
2026-05-10T11:48:03.0371337Z 
2026-05-10T11:48:03.0450955Z > rebno@0.0.0 verify:phase-4 /home/runner/work/rebno/rebno
2026-05-10T11:48:03.0452466Z > node scripts/verify-phase-4.mjs
2026-05-10T11:48:03.0453443Z 
2026-05-10T11:48:03.0735502Z 
2026-05-10T11:48:03.0736964Z === Workspace: typecheck ===
2026-05-10T11:48:03.0745605Z >>> pnpm -r typecheck
2026-05-10T11:48:03.4172992Z Scope: 5 of 6 workspace projects
2026-05-10T11:48:03.4238668Z packages/db typecheck$ tsc --noEmit
2026-05-10T11:48:03.4258862Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T11:48:05.9591705Z packages/game-logic typecheck: Done
2026-05-10T11:48:05.9612822Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T11:48:08.2177721Z packages/db typecheck: Done
2026-05-10T11:48:09.4337370Z packages/protocol typecheck: Done
2026-05-10T11:48:09.4344760Z apps/client typecheck$ tsc --noEmit
2026-05-10T11:48:09.4347533Z apps/server typecheck$ tsc --noEmit
2026-05-10T11:48:20.1454052Z apps/client typecheck: Done
2026-05-10T11:48:21.2718594Z apps/server typecheck: Done
2026-05-10T11:48:21.2818227Z 
2026-05-10T11:48:21.2818775Z === Lint: protocol-sync ===
2026-05-10T11:48:21.2819589Z >>> pnpm lint:protocol-sync
2026-05-10T11:48:21.5875686Z 
2026-05-10T11:48:21.5876794Z > rebno@0.0.0 lint:protocol-sync /home/runner/work/rebno/rebno
2026-05-10T11:48:21.5879778Z > node tools/scripts/lint-protocol-sync.mjs
2026-05-10T11:48:21.5880205Z 
2026-05-10T11:48:21.6184940Z lint-protocol-sync: OK
2026-05-10T11:48:21.6296343Z 
2026-05-10T11:48:21.6297076Z === Lint: game-logic-purity ===
2026-05-10T11:48:21.6298303Z >>> pnpm lint:game-logic-purity
2026-05-10T11:48:21.9341493Z 
2026-05-10T11:48:21.9353224Z > rebno@0.0.0 lint:game-logic-purity /home/runner/work/rebno/rebno
2026-05-10T11:48:21.9354481Z > node tools/scripts/lint-game-logic-purity.mjs
2026-05-10T11:48:21.9356939Z 
2026-05-10T11:48:21.9655238Z lint-game-logic-purity: OK (6 file(s) clean)
2026-05-10T11:48:21.9780286Z 
2026-05-10T11:48:21.9787004Z === Lint: better-auth-schema-sync ===
2026-05-10T11:48:21.9793411Z >>> pnpm lint:better-auth-schema-sync
2026-05-10T11:48:22.2807585Z 
2026-05-10T11:48:22.2808697Z > rebno@0.0.0 lint:better-auth-schema-sync /home/runner/work/rebno/rebno
2026-05-10T11:48:22.2811655Z > node tools/scripts/lint-better-auth-schema-sync.mjs
2026-05-10T11:48:22.2812396Z 
2026-05-10T11:48:23.7539109Z lint-better-auth-schema-sync: OK
2026-05-10T11:48:23.7663021Z 
2026-05-10T11:48:23.7663658Z === Lint: rate-limit-budgets ===
2026-05-10T11:48:23.7664895Z >>> pnpm lint:rate-limit-budgets
2026-05-10T11:48:24.0703320Z 
2026-05-10T11:48:24.0704767Z > rebno@0.0.0 lint:rate-limit-budgets /home/runner/work/rebno/rebno
2026-05-10T11:48:24.0706426Z > node tools/scripts/lint-rate-limit-budgets.mjs
2026-05-10T11:48:24.0707841Z 
2026-05-10T11:48:24.1021175Z lint-rate-limit-budgets: OK (5 D-22 budgets locked)
2026-05-10T11:48:24.1152675Z 
2026-05-10T11:48:24.1155197Z === Lint: no-clipboard-rce ===
2026-05-10T11:48:24.1155744Z >>> pnpm lint:no-clipboard-rce
2026-05-10T11:48:24.4172137Z 
2026-05-10T11:48:24.4173261Z > rebno@0.0.0 lint:no-clipboard-rce /home/runner/work/rebno/rebno
2026-05-10T11:48:24.4176227Z > node tools/scripts/lint-no-clipboard-rce.mjs
2026-05-10T11:48:24.4176660Z 
2026-05-10T11:48:24.4516315Z lint-no-clipboard-rce: OK (21 file(s) clean)
2026-05-10T11:48:24.4637934Z 
2026-05-10T11:48:24.4638422Z === Lint: room-layout ===
2026-05-10T11:48:24.4639198Z >>> pnpm lint:room-layout
2026-05-10T11:48:24.7672471Z 
2026-05-10T11:48:24.7673801Z > rebno@0.0.0 lint:room-layout /home/runner/work/rebno/rebno
2026-05-10T11:48:24.7675028Z > node tools/scripts/lint-room-layout.mjs
2026-05-10T11:48:24.7675715Z 
2026-05-10T11:48:24.8019704Z lint-room-layout: OK
2026-05-10T11:48:24.8136986Z 
2026-05-10T11:48:24.8137595Z === ADR 0004 lint ===
2026-05-10T11:48:24.8138562Z >>> pnpm lint:adr:0004
2026-05-10T11:48:25.1203624Z 
2026-05-10T11:48:25.1204634Z > rebno@0.0.0 lint:adr:0004 /home/runner/work/rebno/rebno
2026-05-10T11:48:25.1206252Z > node tools/asset-catalog/scripts/lint-adr.mjs docs/adr/0004-room-hot-reload.md --no-matrix
2026-05-10T11:48:25.1207205Z 
2026-05-10T11:48:25.1539172Z OK: ADR docs/adr/0004-room-hot-reload.md validated (no-matrix mode — Michael Nygard sections present)
2026-05-10T11:48:25.1662425Z 
2026-05-10T11:48:25.1662903Z === Drizzle: emit-check ===
2026-05-10T11:48:25.1663595Z >>> pnpm db:emit-check
2026-05-10T11:48:25.4829406Z 
2026-05-10T11:48:25.4830467Z > rebno@0.0.0 db:emit-check /home/runner/work/rebno/rebno
2026-05-10T11:48:25.4834080Z > pnpm -C packages/db exec drizzle-kit generate && node -e "require('fs').copyFileSync('packages/db/migrations/0001_baseline.sql','docs/extracted-server/0001_baseline.sql')" && git diff --exit-code packages/db/migrations/0001_baseline.sql docs/extracted-server/0001_baseline.sql
2026-05-10T11:48:25.4836484Z 
2026-05-10T11:48:25.9459518Z No config path provided, using default 'drizzle.config.ts'
2026-05-10T11:48:25.9462964Z Reading config file '/home/runner/work/rebno/rebno/packages/db/drizzle.config.ts'
2026-05-10T11:48:26.3213148Z 8 tables
2026-05-10T11:48:26.3214024Z accounts 8 columns 1 indexes 0 fks
2026-05-10T11:48:26.3215032Z audit_log 6 columns 0 indexes 2 fks
2026-05-10T11:48:26.3215978Z characters 9 columns 0 indexes 1 fks
2026-05-10T11:48:26.3216900Z inventory_items 4 columns 0 indexes 1 fks
2026-05-10T11:48:26.3217832Z legacy_credentials_staging 6 columns 0 indexes 0 fks
2026-05-10T11:48:26.3218767Z message_board_replies 5 columns 0 indexes 2 fks
2026-05-10T11:48:26.3219761Z message_board_topics 7 columns 0 indexes 1 fks
2026-05-10T11:48:26.3220688Z sessions 5 columns 0 indexes 1 fks
2026-05-10T11:48:26.3221273Z 
2026-05-10T11:48:26.3222472Z No schema changes, nothing to migrate 😴
2026-05-10T11:48:26.4290672Z 
2026-05-10T11:48:26.4291404Z === Drizzle: schema-sync ===
2026-05-10T11:48:26.4293025Z >>> pnpm lint:schema-sync
2026-05-10T11:48:26.7432823Z 
2026-05-10T11:48:26.7433879Z > rebno@0.0.0 lint:schema-sync /home/runner/work/rebno/rebno
2026-05-10T11:48:26.7437706Z > node -e "const a=require('fs').readFileSync('packages/db/migrations/0001_baseline.sql');const b=require('fs').readFileSync('docs/extracted-server/0001_baseline.sql');if(Buffer.compare(a,b)!==0){console.error('docs/extracted-server/0001_baseline.sql out of sync with packages/db/migrations/0001_baseline.sql');process.exit(1)}console.log('OK')"
2026-05-10T11:48:26.7440321Z 
2026-05-10T11:48:26.7699512Z OK
2026-05-10T11:48:26.7832877Z 
2026-05-10T11:48:26.7843031Z === Drizzle: source-comments ===
2026-05-10T11:48:26.7844787Z >>> pnpm lint:source-comments
2026-05-10T11:48:27.1217869Z 
2026-05-10T11:48:27.1218973Z > rebno@0.0.0 lint:source-comments /home/runner/work/rebno/rebno
2026-05-10T11:48:27.1220552Z > pnpm -C packages/db run lint:source-comments
2026-05-10T11:48:27.1221329Z 
2026-05-10T11:48:27.4420527Z 
2026-05-10T11:48:27.4421571Z > @rebno/db@0.1.0 lint:source-comments /home/runner/work/rebno/rebno/packages/db
2026-05-10T11:48:27.4423182Z > node scripts/check-source-comments.mjs
2026-05-10T11:48:27.4424367Z 
2026-05-10T11:48:27.4727714Z check-source-comments: OK (50 columns, all SOURCE-cited)
2026-05-10T11:48:27.4944833Z 
2026-05-10T11:48:27.4945586Z === Workspace: test ===
2026-05-10T11:48:27.4946343Z >>> pnpm -r test
2026-05-10T11:48:27.8344930Z Scope: 5 of 6 workspace projects
2026-05-10T11:48:27.8402701Z packages/db test$ vitest run
2026-05-10T11:48:27.8412654Z packages/game-logic test$ vitest run
2026-05-10T11:48:28.3634162Z packages/db test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/db[39m
2026-05-10T11:48:28.3663657Z packages/game-logic test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/game-logic[39m
2026-05-10T11:48:28.6974668Z packages/game-logic test:  [32m✓[39m test/platform-cycle.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-10T11:48:28.9904293Z packages/game-logic test:  [32m✓[39m test/golden.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T11:48:29.2384279Z packages/game-logic test:  [32m✓[39m test/rng.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T11:48:29.3763922Z packages/db test:  [32m✓[39m tests/schema-shape.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T11:48:29.4811651Z packages/game-logic test:  [32m✓[39m test/accumulator.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T11:48:29.4918098Z packages/game-logic test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T11:48:29.4952191Z packages/game-logic test: [2m      Tests [22m [1m[32m21 passed[39m[22m[90m (21)[39m
2026-05-10T11:48:29.4953541Z packages/game-logic test: [2m   Start at [22m 11:48:28
2026-05-10T11:48:29.4977814Z packages/game-logic test: [2m   Duration [22m 1.11s[2m (transform 125ms, setup 0ms, import 232ms, tests 47ms, environment 1ms)[22m
2026-05-10T11:48:29.5340906Z packages/game-logic test: Done
2026-05-10T11:48:29.5347901Z packages/protocol test$ vitest run
2026-05-10T11:48:30.0575144Z packages/protocol test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/packages/protocol[39m
2026-05-10T11:48:30.2389042Z packages/db test:  [32m✓[39m tests/promotion.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T11:48:30.5220653Z packages/db test:  [32m✓[39m tests/save-format-traceability.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T11:48:30.5269447Z packages/protocol test:  [32m✓[39m test/codec.test.ts [2m([22m[2m18 tests[22m[2m)[22m[32m 25[2mms[22m[39m
2026-05-10T11:48:30.5294037Z packages/db test: [2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
2026-05-10T11:48:30.5295747Z packages/db test: [2m      Tests [22m [1m[32m22 passed[39m[22m[90m (22)[39m
2026-05-10T11:48:30.5312673Z packages/db test: [2m   Start at [22m 11:48:28
2026-05-10T11:48:30.5344724Z packages/db test: [2m   Duration [22m 2.16s[2m (transform 181ms, setup 0ms, import 1.48s, tests 32ms, environment 0ms)[22m
2026-05-10T11:48:30.5629505Z packages/db test: Done
2026-05-10T11:48:30.6999689Z packages/protocol test:  [32m✓[39m test/intents.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T11:48:30.8704104Z packages/protocol test:  [32m✓[39m test/schema-shape.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T11:48:31.0443660Z packages/protocol test:  [32m✓[39m test/state.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T11:48:31.0493552Z packages/protocol test: [2m Test Files [22m [1m[32m4 passed[39m[22m[90m (4)[39m
2026-05-10T11:48:31.0500431Z packages/protocol test: [2m      Tests [22m [1m[32m30 passed[39m[22m[90m (30)[39m
2026-05-10T11:48:31.0507353Z packages/protocol test: [2m   Start at [22m 11:48:30
2026-05-10T11:48:31.0509307Z packages/protocol test: [2m   Duration [22m 982ms[2m (transform 141ms, setup 0ms, import 279ms, tests 41ms, environment 1ms)[22m
2026-05-10T11:48:31.0816095Z packages/protocol test: Done
2026-05-10T11:48:31.0822525Z apps/client test$ vitest run --exclude 'test/e2e/**'
2026-05-10T11:48:31.0824925Z apps/server test$ vitest run --exclude 'test/**/*.integ.test.ts'
2026-05-10T11:48:31.6584152Z apps/server test: [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/rebno/rebno/apps/server[39m
2026-05-10T11:48:31.6727152Z apps/client test: [1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/rebno/rebno/apps/client[39m
2026-05-10T11:48:32.6569382Z apps/server test: {"level":30,"time":1778413712655,"pid":4343,"hostname":"runnervmeorf1","password":"[Redacted]","session_token":"[Redacted]","msg":"login"}
2026-05-10T11:48:32.6624524Z apps/server test:  [32m✓[39m test/otel-init.test.ts [2m([22m[2m4 tests[22m[2m)[22m[33m 685[2mms[22m[39m
2026-05-10T11:48:32.6643593Z apps/server test:      [33m[2m✓[22m[39m does not throw when OTEL_EXPORTER_OTLP_ENDPOINT is unset [33m 570[2mms[22m[39m
2026-05-10T11:48:33.4904527Z apps/client test: [90mstderr[2m | src/__test__/game-scene.test.ts[2m > [22m[2mscenes/GameScene[2m > [22m[2mtest 5: onRoomLayout calls verifyRoomLayout first; render skipped on false
2026-05-10T11:48:33.4906904Z apps/client test: [22m[39mroom_layout signature did not verify — rendering skipped for mvp-lobby 000
2026-05-10T11:48:33.5043793Z apps/client test:  [32m✓[39m src/__test__/game-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 151[2mms[22m[39m
2026-05-10T11:48:33.7211118Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 1: fresh DB — migrate creates accounts table and records migration row
2026-05-10T11:48:33.7223655Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-OGvOoc/rebno.db
2026-05-10T11:48:33.7243220Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T11:48:33.7252900Z apps/server test: [run-migrations] OK
2026-05-10T11:48:33.7344384Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 2: pre-bootstrapped DB (Assumption A7) — reconcile seeds row before migrate runs
2026-05-10T11:48:33.7346498Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-vC0Aev/rebno.db
2026-05-10T11:48:33.7347986Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T11:48:33.7350440Z apps/server test: [run-migrations] reconciled __drizzle_migrations for pre-bootstrap DB (Assumption A7) — seeded 0001_baseline
2026-05-10T11:48:33.7351532Z apps/server test: [run-migrations] OK
2026-05-10T11:48:33.7464257Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T11:48:33.7486253Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-RHRtNO/rebno.db
2026-05-10T11:48:33.7495658Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T11:48:33.7532569Z apps/server test: [run-migrations] OK
2026-05-10T11:48:33.7564352Z apps/server test: [90mstdout[2m | test/run-migrations.test.ts[2m > [22m[2mrun-migrations.ts (Plan 12)[2m > [22m[2mScenario 3: idempotent second run — no error, no extra rows
2026-05-10T11:48:33.7593188Z apps/server test: [22m[39m[run-migrations] opening /tmp/rebno-migrate-test-RHRtNO/rebno.db
2026-05-10T11:48:33.7605850Z apps/server test: [run-migrations] migrationsFolder=/home/runner/work/rebno/rebno/packages/db/migrations
2026-05-10T11:48:33.7623111Z apps/server test: [run-migrations] OK
2026-05-10T11:48:33.7625176Z apps/server test:  [32m✓[39m test/run-migrations.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 66[2mms[22m[39m
2026-05-10T11:48:34.6803110Z apps/client test:  [32m✓[39m src/__test__/chat-hud.test.ts [2m([22m[2m9 tests[22m[2m)[22m[32m 140[2mms[22m[39m
2026-05-10T11:48:34.8869305Z apps/server test:  [32m✓[39m test/persistence.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 69[2mms[22m[39m
2026-05-10T11:48:35.2183507Z apps/server test:  [32m✓[39m test/legacy-login.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-10T11:48:35.4999448Z apps/server test:  [32m✓[39m test/room-key.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 23[2mms[22m[39m
2026-05-10T11:48:35.7983694Z apps/server test:  [32m✓[39m test/log.test.ts [2m([22m[2m2 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-10T11:48:35.9545319Z apps/client test:  [32m✓[39m src/__test__/reconnect.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 112[2mms[22m[39m
2026-05-10T11:48:36.0434464Z apps/server test:  [32m✓[39m test/admin-stubs.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T11:48:36.4194196Z apps/server test: {"level":40,"time":1778413716402,"pid":4471,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T11:48:36.4196874Z apps/server test: {"level":40,"time":1778413716406,"pid":4471,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T11:48:36.4347294Z apps/server test: {"level":40,"time":1778413716407,"pid":4471,"hostname":"runnervmeorf1","path":"/api/foo","msg":"staging_invite_rejected"}
2026-05-10T11:48:36.4373822Z apps/server test:  [32m✓[39m test/staging-invite.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 20[2mms[22m[39m
2026-05-10T11:48:36.6628720Z apps/server test:  [32m✓[39m test/rate-limit.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T11:48:37.2901645Z apps/client test:  [32m✓[39m src/__test__/force-reset-overlay.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 142[2mms[22m[39m
2026-05-10T11:48:37.5174111Z apps/server test: [90mstdout[2m | test/tick-accumulator.test.ts
2026-05-10T11:48:37.5183684Z apps/server test: [22m[39m◇ injected env (50) from ../../../../../../../etc/environment // tip: ◈ secrets for agents [www.dotenvx.com]
2026-05-10T11:48:37.5219909Z apps/server test: ℹ️  optional .env file not found: .env.test, .env
2026-05-10T11:48:38.2858365Z apps/server test:  [32m✓[39m test/tick-accumulator.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T11:48:38.3796032Z apps/client test:  [32m✓[39m src/__test__/nameplate.test.ts [2m([22m[2m3 tests[22m[2m)[22m[32m 44[2mms[22m[39m
2026-05-10T11:48:38.5430302Z apps/server test:  [32m✓[39m test/health.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T11:48:38.5432818Z apps/server test: [2m Test Files [22m [1m[32m11 passed[39m[22m[90m (11)[39m
2026-05-10T11:48:38.5434931Z apps/server test: [2m      Tests [22m [1m[32m61 passed[39m[22m[90m (61)[39m
2026-05-10T11:48:38.5462939Z apps/server test: [2m   Start at [22m 11:48:31
2026-05-10T11:48:38.5469876Z apps/server test: [2m   Duration [22m 6.86s[2m (transform 473ms, setup 0ms, import 3.51s, tests 943ms, environment 2ms)[22m
2026-05-10T11:48:38.6068867Z apps/server test: Done
2026-05-10T11:48:39.1735316Z apps/client test:  [32m✓[39m src/__test__/login-scene.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 10[2mms[22m[39m
2026-05-10T11:48:39.9587969Z apps/client test:  [32m✓[39m src/__test__/colyseus-client.test.ts [2m([22m[2m8 tests[22m[2m)[22m[32m 11[2mms[22m[39m
2026-05-10T11:48:40.6658303Z apps/client test:  [32m✓[39m src/__test__/input-dispatcher.test.ts [2m([22m[2m10 tests[22m[2m)[22m[32m 15[2mms[22m[39m
2026-05-10T11:48:41.3562422Z apps/client test:  [32m✓[39m src/__test__/room-layout-verify.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 9[2mms[22m[39m
2026-05-10T11:48:42.0472732Z apps/client test:  [32m✓[39m src/__test__/atlas-loader.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 8[2mms[22m[39m
2026-05-10T11:48:42.7135810Z apps/client test:  [32m✓[39m src/__test__/auth-client.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 7[2mms[22m[39m
2026-05-10T11:48:43.4170077Z apps/client test:  [32m✓[39m src/__test__/reconciler.test.ts [2m([22m[2m4 tests[22m[2m)[22m[32m 6[2mms[22m[39m
2026-05-10T11:48:44.0938469Z apps/client test:  [32m✓[39m src/__test__/prediction.test.ts [2m([22m[2m6 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T11:48:44.7886336Z apps/client test:  [32m✓[39m src/__test__/extrapolation.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T11:48:45.4382558Z apps/client test:  [32m✓[39m src/__test__/protocol-version-check.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
2026-05-10T11:48:46.1129490Z apps/client test:  [32m✓[39m src/__test__/env.test.ts [2m([22m[2m5 tests[22m[2m | [22m[33m4 skipped[39m[2m)[22m[32m 4[2mms[22m[39m
2026-05-10T11:48:46.1319296Z apps/client test: [2m Test Files [22m [1m[32m16 passed[39m[22m[90m (16)[39m
2026-05-10T11:48:46.1343580Z apps/client test: [2m      Tests [22m [1m[32m98 passed[39m[22m[2m | [22m[90m4 todo[39m[90m (102)[39m
2026-05-10T11:48:46.1349333Z apps/client test: [2m   Start at [22m 11:48:31
2026-05-10T11:48:46.1351678Z apps/client test: [2m   Duration [22m 14.46s[2m (transform 565ms, setup 66ms, collect 843ms, tests 673ms, environment 8.36s, prepare 1.63s)[22m
2026-05-10T11:48:46.2693483Z apps/client test: Done
2026-05-10T11:48:46.2771242Z 
2026-05-10T11:48:46.2772679Z verify-phase-4: OK (12 steps green)
2026-05-10T11:48:46.2879058Z 
2026-05-10T11:48:46.2879570Z === Workspace: typecheck ===
2026-05-10T11:48:46.2880372Z >>> pnpm -r typecheck
2026-05-10T11:48:46.5980061Z Scope: 5 of 6 workspace projects
2026-05-10T11:48:46.6034806Z packages/db typecheck$ tsc --noEmit
2026-05-10T11:48:46.6044436Z packages/game-logic typecheck$ tsc --noEmit
2026-05-10T11:48:49.2054192Z packages/game-logic typecheck: Done
2026-05-10T11:48:49.2103694Z packages/protocol typecheck$ tsc --noEmit
2026-05-10T11:48:51.1843104Z packages/db typecheck: Done
2026-05-10T11:48:52.5932237Z packages/protocol typecheck: Done
2026-05-10T11:48:52.5938948Z apps/client typecheck$ tsc --noEmit
2026-05-10T11:48:52.5942329Z apps/server typecheck$ tsc --noEmit
2026-05-10T11:49:03.5540803Z apps/client typecheck: Done
2026-05-10T11:49:04.4198351Z apps/server typecheck: Done
2026-05-10T11:49:04.4479624Z 
2026-05-10T11:49:04.4480175Z === Lint: deploy-stack ===
2026-05-10T11:49:04.4481387Z >>> pnpm lint:deploy-stack
2026-05-10T11:49:04.7502347Z 
2026-05-10T11:49:04.7503673Z > rebno@0.0.0 lint:deploy-stack /home/runner/work/rebno/rebno
2026-05-10T11:49:04.7505064Z > node tools/scripts/lint-deploy-stack.mjs
2026-05-10T11:49:04.7505724Z 
2026-05-10T11:49:04.7804675Z lint-deploy-stack: docker-entrypoint.sh: missing run-migrations.js call (D-09 BLOCKING)
2026-05-10T11:49:04.7953203Z  ELIFECYCLE  Command failed with exit code 1.
2026-05-10T11:49:04.8139558Z 
2026-05-10T11:49:04.8142550Z verify-phase-5 FAILED at step 'Lint: deploy-stack': pnpm lint:deploy-stack (exit 1)
2026-05-10T11:49:04.8144256Z Fix the failing step and re-run `pnpm verify:phase-5`.
2026-05-10T11:49:04.8298601Z  ELIFECYCLE  Command failed with exit code 1.
2026-05-10T11:49:04.8481341Z ##[error]Process completed with exit code 1.
